/* 包名 */
package main;

/* 引入指定的函数 */
import "fmt"
import "unsafe"
import "strconv"

/**
数据类型主要有以下几种:
基本数据类型:
	数值型
		整数类型:int,int8,int16,int32,int64,
		浮点类型: float32,float64
	字符型:(没有专门的字符型 ,使用byte来保存单个字母字符)
	布尔型:(bool)
	字符串:(string);官方将string归属到了基本数据类型
派生/复杂数据类型:
	指针
	数组
	结构体
	管道
	函数
	切片
	接口
	map
*/

func main(){
	fmt.Println("测试一下"); 
	/* 声明一个变量
	int:系统会自动判断,指定了int8;只能是-128到127之间的数
	*/
	//var a byte = 1000;
	var a int = 1000;
	var b int = 20;
	fmt.Println("a的值:", a);
	fmt.Println("b的值:", b);

	/* 查看是什么类型,注意方法调用的不一样了 */
	fmt.Printf("a的类型为: %T \n", a);

	var c float32 = 3.14;
	/* 系统默认为float64 */
	var d = 7.14;
	fmt.Println("c的值:", c);
	fmt.Println("d的值:", d)
	fmt.Printf("c的类型为: %T \n", c);
	fmt.Printf("d的类型为: %T \n", d);

	/* 科学计数法 */
	e := 3.14e2;
	fmt.Println("e的值:", e);

	/* 字符,byte==uint8 */
	var c1 byte = 'a';
	var c2 byte = 'b';
	fmt.Println("c1=%c,c2=%c\n", c1, c2);
	fmt.Printf("c1的类型为: %T c2的类型为: %T \n", c1, c2);

	/* boolean类型*/
	var f = false;
	fmt.Println("f的值:", f);
	/* 需要引入unsafe */
	fmt.Println("f=占用的字节", unsafe.Sizeof(f));

	/* 字符串类型 */
	var g string = "hello world" + " execute";
	fmt.Println("g的值:", g);
	fmt.Println("g的长度", len(g));
	fmt.Println("g占用的字节数", unsafe.Sizeof(g));
	/* 不允许修改 */
	//g[0] = 'a';

	/* 变量相互转换 */
	var num1 int = 99;
	var str string;
	var b1 bool;
	str = fmt.Sprintf("%d", num1);
	fmt.Println("num1的值:", str);

	str = strconv.FormatInt(int64(num1), 10);
	fmt.Println("str:", str);

	var str1 string = "true";
	b1,_ = strconv.ParseBool(str1);
	fmt.Println("b1:", b1);

	/* 字符串 */
	var str2 string = `
		public static void main(String[] args){
			System.out.println("====)
		}
	`
	fmt.Println("==反引号的输出==", str2)

	/* 字符串相加,+必须在行尾不能在行的开始 */
	var str3 string = "hello" + "world" + 
		"test";
	fmt.Println("==str3==", str3)

	var i1 int = 10;
	fmt.Println("i:", i1);
	/* 查看指针的内存地址 */
	fmt.Println("i:", &i1);

	/* ptr是一个指针变量 */
	var ptr *int = &i1;
	fmt.Println("i-ptr:", ptr);
	fmt.Println("i&ptr:", &ptr);
	fmt.Println("i*ptr:", *ptr); //指向的是真实的值 10

	/* 变量的默认值 */
	var defInt int ;
	var def32Float float32;
	var def64Float float64;
	/* bool类型 */
	var defBoolean bool;
	var defStr string;
	fmt.Println("==defInt(默认值)==", defInt)
	fmt.Println("==def32Float(默认值)==", def32Float)
	fmt.Println("==def64Float(默认值)==", def64Float)
	fmt.Println("==defBoolean(默认值)==", defBoolean)
	fmt.Println("==defStr(默认值)==", defStr)
}